home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / APPLICAT / C034.ZIP / DBQSCN.C < prev    next >
Text File  |  2010-11-01  |  9KB  |  517 lines

  1. /* SDB - token scanning routines */
  2.  
  3. #include "bdscio.h"
  4. #include "dbqdefs.h"
  5.  
  6. #define STDIN 0        /* Maybe - check up */
  7.  
  8. db_sinit()
  9. {
  10.     atbol = TRUE;
  11.     lptr = NULL;
  12.     savech = EOS;
  13.     savetkn = NULL;
  14.     dbv_ifp = NULL;
  15.     dbv_lfp = NULL;
  16.     dbv_macros = NULL;
  17.     dbv_verify = FALSE;
  18.     dbv_total = FALSE;
  19.     dbv_fold = TRUE;
  20.     dbv_auto = FALSE;
  21.     dbv_logging = FALSE;
  22.     dbv_pgln = 32000;    /* equivalent to no paging */
  23. }
  24.  
  25. db_prompt(ip,cp)
  26.     char *ip,*cp;
  27. {
  28.     iprompt = ip;
  29.     cprompt = cp;
  30. }
  31.  
  32. #ifdef DBPI
  33. db_scan(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
  34. {
  35.     sprintf(cmdline,fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
  36.  
  37.     lptr = cmdline;
  38.     iprompt = NULL;
  39.     dbv_ifp = NULL;
  40.  
  41.     savech = EOS;
  42.     savetkn = NULL;
  43.     dbv_fold = TRUE;
  44. }
  45. #endif
  46.  
  47. int db_flush(range)
  48. int range;
  49.     /* range = 1 to flush out anything on line, else NULL to check */
  50. {
  51.     while (savech != '\n')
  52.         if (savech > ' ' && range == NULL)
  53.             { RETERR(SYNTAX) }
  54.         else
  55.             savech = getchx();
  56.  
  57.     savech = EOS;
  58.     atbol = TRUE;
  59.     return (TRUE);
  60. }
  61.  
  62. char *db_gline(buf)
  63.     char *buf;
  64. {
  65.     int ch,i;
  66.  
  67.     for (i = 0; (ch = getch()) != '\n' && ch != -1; )
  68.         if (i < LINEMAX)
  69.             buf[i++] = ch;
  70.         else {
  71.             printf("### Maximum line length is %d ###\nRe-enter> ",LINEMAX);
  72.             i = 0;
  73.         }
  74.     buf[i] = EOS;
  75.  
  76.     return (buf);
  77. }
  78.  
  79. int db_ifile(fname)
  80.     char *fname;
  81. {
  82.     struct ifile *new_ifp;
  83.  
  84.     if ((new_ifp = CALLOC(IFSIZE)) == NULL)
  85.         { RETERR(INSMEM) }
  86.     else if ((new_ifp->if_fp = CALLOC(BUFSIZ)) == NULL)
  87.         { CFREE(new_ifp);
  88.         RETERR(INSMEM) }
  89.     else if (fopen(fname,new_ifp->if_fp) == -1) {
  90.         CFREE(new_ifp->if_fp);
  91.         CFREE(new_ifp);
  92.         RETERR(INDFNF)
  93.     }
  94.     new_ifp->if_mtext = NULL;
  95.     new_ifp->if_savech = savech;
  96.     new_ifp->if_lptr = lptr;
  97.     new_ifp->if_next = dbv_ifp;
  98.     dbv_ifp = new_ifp;
  99.  
  100.     return (TRUE);
  101. }
  102.  
  103. db_kill()
  104. {
  105.     struct ifile *old_ifp;
  106.  
  107.     while ((old_ifp = dbv_ifp) != NULL) {
  108.         dbv_ifp = old_ifp->if_next;
  109.         if (old_ifp->if_fp != NULL)
  110.             { fclose(old_ifp->if_fp);
  111.               CFREE(old_ifp->if_fp); }
  112.         savech = old_ifp->if_savech;
  113.         lptr = old_ifp->if_lptr;
  114.         CFREE(old_ifp);
  115.     }
  116.  
  117.     while (savech != '\n')
  118.         savech = getchx();
  119.     savech = EOS;
  120.     savetkn = NULL;
  121.     atbol = TRUE;
  122. }
  123.  
  124. int db_token()
  125. {
  126.     struct macro *mptr;
  127.     struct ifile *new_ifp;
  128.     while (db_xtoken() == ID) {
  129.       for (mptr = dbv_macros; mptr != NULL; mptr = mptr->mc_next)
  130.         if (db_scmp(dbv_tstring,mptr->mc_name) == 0) {
  131.            if ((new_ifp = CALLOC(IFSIZE)) == NULL)
  132.             printf("### Out of memory using %s ###",dbv_tstring);
  133.            else {
  134.             new_ifp->if_fp = NULL;
  135.             new_ifp->if_mtext = mptr->mc_mtext->mt_next;
  136.             new_ifp->if_lptr = lptr; lptr = mptr->mc_mtext->mt_text;
  137.             new_ifp->if_savech = savech; savech = EOS;
  138.             new_ifp->if_next = dbv_ifp;
  139.             dbv_ifp = new_ifp;
  140.            }
  141.            savetkn = NULL;
  142.            break;
  143.         }
  144.  
  145.       if (mptr == NULL)
  146.         break;
  147.  
  148.     }
  149.  
  150.     return (dbv_token);
  151. }
  152.  
  153. int db_xtoken()
  154. {
  155.     int ch;
  156.     if ((dbv_token = savetkn) != NULL)
  157.         return (dbv_token);
  158.  
  159.     ch = nextch();
  160.  
  161.     if (isalpha(ch))
  162.         get_id();
  163.     else if ((isdigit(ch)) || (ch == '-'))
  164.         get_number();
  165.     else if (ch == '"')
  166.         get_string();
  167.     else if (get_rel())
  168.         ;
  169.     else
  170.         dbv_token = getch();
  171.  
  172.     savetkn = dbv_token;
  173.     return (dbv_token);
  174. }
  175.  
  176. int db_ntoken()
  177. {
  178.     db_token();
  179.  
  180.     savetkn = NULL;
  181.  
  182.     return (dbv_token);
  183. }
  184.  
  185. int db_xntoken()
  186. {
  187.     db_xtoken();
  188.     savetkn = NULL;
  189.     return (dbv_token);
  190. }
  191.  
  192. int db_scmp(str1,str2)
  193.     char *str1,*str2;
  194. {
  195.     if (dbv_fold)
  196.         return (scmp(str1,str2));
  197.     else
  198.         return (strcmp(str1,str2));
  199. }
  200.  
  201. int db_sncmp(str1,str2,len)
  202.     char *str1,*str2; int len;
  203. {
  204.     if (dbv_fold)
  205.         return (sncmp(str1,str2,len));
  206.     else
  207.         return (strncmp(str1,str2,len));
  208. }
  209.  
  210. int scmp(str1,str2)
  211.     char *str1,*str2;
  212. {
  213.     int ch1,ch2;
  214.  
  215.     while (*str1 && *str2) {
  216.  
  217.         ch1 = tolower(*str1++);
  218.         ch2 = tolower(*str2++);
  219.  
  220.         if (ch1 != ch2)
  221.             if (ch1 < ch2)
  222.                 return (-1);
  223.             else
  224.                 return (1);
  225.     }
  226.  
  227.     if (*str1 == *str2)
  228.         return (0);
  229.     else if (*str1 == 0)
  230.         return (-1);
  231.     else
  232.         return (1);
  233. }
  234.  
  235.  
  236. int sncmp(str1,str2,len)
  237.     char *str1,*str2; int len;
  238. {
  239.     int ch1,ch2;
  240.  
  241.     while (*str1 && *str2 && len > 0) {
  242.  
  243.         ch1 = tolower(*str1++);
  244.  
  245.         ch2 = tolower(*str2++);
  246.  
  247.         if (ch1 != ch2)
  248.             if (ch1 < ch2)
  249.                 return (-1);
  250.             else
  251.                 return (1);
  252.         len--;
  253.     }
  254.  
  255.     if (len == 0 || *str1 == *str2)
  256.         return (0);
  257.     else if (*str1 == 0)
  258.         return (-1);
  259.     else
  260.         return (1);
  261. }
  262.  
  263. #define KEYMATCH(kmword,kmtoken) if (db_scmp(dbv_tstring,kmword) == 0) dbv_token = kmtoken
  264.  
  265. get_id()
  266. {
  267.     int ch,nchars,i;
  268.  
  269.     ch = nextch();
  270.     nchars = 0;
  271.  
  272. /*    if alphanumeric or underscore or colon    */
  273.  
  274.     while (isalpha(ch) || isdigit(ch) || ch == 95 || ch == 58) {
  275.         if (nchars < KEYWORDMAX)
  276.             dbv_tstring[nchars++] = ch;
  277.         getch(); ch = thisch();
  278.     }
  279.  
  280.     dbv_tstring[nchars] = EOS;
  281.  
  282.     dbv_token = ID;
  283.  
  284. /*    keywords - most popular ones first    */
  285.  
  286.     KEYMATCH("print",PRINT);
  287.     KEYMATCH("with",WHERE);
  288.     KEYMATCH("define",DEFYNE);
  289.     KEYMATCH("enter",PROMPT);
  290.     KEYMATCH("delete",DELETE);
  291.     KEYMATCH("of",FROM);
  292.     KEYMATCH("insert",INSERT);
  293.     KEYMATCH("find",SELECT);
  294.     KEYMATCH("update",UPDATE);
  295.     KEYMATCH("using",USING);
  296.     KEYMATCH("show",SHOW);
  297.     KEYMATCH("into",INTO);
  298. /* character keywords */
  299.     KEYMATCH("help",HELP);
  300.     KEYMATCH("and",CHAND);
  301.     KEYMATCH("or",CHOR);
  302.     KEYMATCH("not",CHNOT);
  303.     KEYMATCH("all",CHALL);
  304.  
  305. /*    keywords for DBA    */
  306.  
  307.     KEYMATCH("asc",ASCENDING);
  308.     KEYMATCH("by",BY);
  309.     KEYMATCH("char",CHARR);
  310.     KEYMATCH("compress",COMPRESS);
  311.     KEYMATCH("create",CREATE);
  312.     KEYMATCH("desc",DESCENDING);
  313.     KEYMATCH("export",EXPORT);
  314.     KEYMATCH("extract",EXTRACT);
  315.     KEYMATCH("import",IMPORT);
  316.     KEYMATCH("num",NUM);
  317.     KEYMATCH("sort",SORT);
  318.     KEYMATCH("erase",ERASE);
  319.     KEYMATCH("rename",RENAME);
  320.  
  321. /*    common keywords        */
  322.  
  323.     KEYMATCH("exit",EXXIT);
  324.     KEYMATCH("set",SET);
  325.  
  326. }
  327.  
  328. get_number()
  329.  
  330. {
  331.     int ch,ndigits,nodot;
  332.  
  333.     ch = nextch();
  334.     ndigits = 0; nodot = TRUE;
  335.     while (isdigit(ch) || (ch == '-') || (nodot && ch == '.')) {
  336.         if (ch == '.')
  337.             nodot = FALSE;
  338.         if (ndigits < NUMBERMAX)
  339.             dbv_tstring[ndigits++] = ch;
  340.         getch(); ch = thisch();
  341.     }
  342.  
  343.     dbv_tstring[ndigits] = EOS;
  344.  
  345.     sscanf(dbv_tstring,"%d",&dbv_tvalue);
  346.  
  347.     dbv_token = NUMBER;
  348. }
  349.  
  350. get_string()
  351. {
  352.     int ch,nchars;
  353.  
  354.     getch();
  355.  
  356.     ch = thisch();
  357.     nchars = 0;
  358.     while (ch && ch != '"') {
  359.         if (nchars < STRINGMAX)
  360.             dbv_tstring[nchars++] = ch;
  361.         getch(); ch = thisch();
  362.     }
  363.  
  364.     dbv_tstring[nchars] = EOS;
  365.     getch();
  366.     dbv_token = STRING;
  367. }
  368.  
  369. int get_rel()
  370. {
  371.     int ch;
  372.  
  373.     switch (ch = nextch()) {
  374.     case '=':
  375.         getch();
  376.         dbv_token = EQL;
  377.         return (TRUE);;
  378.     case '<':
  379.         getch(); ch = nextch();
  380.         if (ch == '>') {
  381.             getch();
  382.             dbv_token = NEQ;
  383.         }
  384.         else if (ch == '=') {
  385.             getch();
  386.             dbv_token = LEQ;
  387.         }
  388.         else
  389.             dbv_token = LSS;
  390.         return (TRUE);;
  391.     case '>':
  392.         getch(); ch = nextch();
  393.         if (ch == '=') {
  394.             getch();
  395.             dbv_token = GEQ;
  396.         }
  397.         else
  398.             dbv_token = GTR;
  399.         return (TRUE);;
  400.     case '}':
  401.         getch();
  402.         dbv_token = CONT;
  403.         return (TRUE);;
  404.     default:
  405.         return (FALSE);
  406.     }
  407. }
  408.  
  409. int getch()
  410. {
  411.     char fname[STRINGMAX+1];
  412.     int ch,i;
  413.     if (savech != EOS) {
  414.         ch = savech;
  415.         savech = EOS;
  416.         return (ch);
  417.     }
  418.  
  419.     ch = getchx();
  420.  
  421.     if (atbol && iprompt != NULL)
  422.         while (ch <= ' ')
  423.             ch = getchx();
  424.     iprompt = NULL;
  425.  
  426.     while (ch == '@') {
  427.         for (i = 0; (savech = getchx()) > ' '; )
  428.             if (i < STRINGMAX)
  429.                 fname[i++] = savech;
  430.         fname[i] = 0;
  431.         if (db_ifile(fname) != TRUE)
  432.             printf("### Error opening ICF %s ###\n",fname);
  433.         ch = getchx();
  434.     }
  435.  
  436.     return (ch);
  437. }    
  438.  
  439. int getchx()
  440. {
  441.     struct ifile *old_ifp;
  442.     int ch;
  443.  
  444.     if (lptr != NULL) {
  445.         while (*lptr == EOS)
  446.  
  447.         /* some stuff for ICFs */
  448.          if (dbv_ifp != NULL)
  449.           if (dbv_ifp->if_mtext == NULL) {
  450.             old_ifp = dbv_ifp;
  451.             ch = dbv_ifp->if_savech; savech = EOS;
  452.             lptr = dbv_ifp->if_lptr;
  453.             dbv_ifp = dbv_ifp->if_next;
  454.             if (old_ifp->if_fp != NULL)
  455.                 CFREE(old_ifp->if_fp);
  456.             CFREE(old_ifp);
  457.             if (ch != EOS)
  458.                 return (ch);
  459.             if (lptr == NULL)
  460.                 break;
  461.         }
  462.         else {
  463.             lptr = dbv_ifp->if_mtext->mt_text;
  464.             dbv_ifp->if_mtext = dbv_ifp->if_mtext->mt_next;
  465.         }
  466.     else
  467.         return (EOS);
  468.  
  469.         if (lptr != NULL)
  470.             return (*lptr++);
  471.     }
  472.  
  473.     if (atbol && dbv_ifp == NULL) {
  474.         if (iprompt != NULL)
  475.             printf("%s",iprompt);
  476.         else if (cprompt != NULL)
  477.             printf("%s",cprompt);
  478.     }
  479.  
  480.     if (dbv_ifp == NULL)
  481.         if ((ch = getcx(STDIN)) == '\n')
  482.             atbol = TRUE;
  483.         else
  484.             atbol = FALSE;
  485.         else {
  486.         if (((ch = getcx(dbv_ifp->if_fp)) == ERROR) || (ch == CPMEOF)) {
  487.             old_ifp = dbv_ifp;
  488.             ch = dbv_ifp->if_savech; savech = EOS;
  489.             lptr = dbv_ifp->if_lptr;
  490.             dbv_ifp = dbv_ifp->if_next;
  491.             fclose(old_ifp->if_fp);
  492.             CFREE(old_ifp->if_fp);
  493.             CFREE(old_ifp);
  494.         }
  495.     }
  496.     return (ch);
  497. }
  498.  
  499. int thisch()
  500. {
  501.     if (savech == EOS)
  502.         savech = getch();
  503.  
  504.     return (savech);
  505. }
  506.  
  507. int nextch()
  508. {
  509.     int ch;
  510.  
  511.     while ((ch = thisch()) <= ' ' && ch != EOS)
  512.         getch();
  513.  
  514.     return (ch);
  515. }
  516.  
  517. n (